package org.arquillian.cube.docker.junit.rule; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Network; import org.arquillian.cube.docker.impl.client.containerobject.dsl.NetworkBuilder; import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.spi.metadata.IsNetworkContainerObject; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.MultipleFailureException; import org.junit.runners.model.Statement; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class NetworkDslRule implements TestRule { private DockerClientExecutor dockerClientExecutor; private NetworkBuilder networkBuilder; private Network network; public NetworkDslRule(String networkId) { this.networkBuilder = Network.withDefaultDriver(networkId); initializeDockerClient(); } public NetworkDslRule(String networkName, String driver) { this.networkBuilder = Network.withDriver(networkName, driver); initializeDockerClient(); } private void initializeDockerClient() { this.dockerClientExecutor = DockerClientInitializer.initialize(); } public List<String> getNetworks() { return this.dockerClientExecutor.getNetworks().stream() .map(com.github.dockerjava.api.model.Network::getName) .collect(Collectors.toList()); } public String getNetworkName() { return this.network.getId(); } @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { List<Throwable> errors = new ArrayList<>(); network = networkBuilder.build(); final org.arquillian.cube.docker.impl.client.config.Network dockerNetwork = network.getNetwork(); String networkId = null; try { networkId = dockerClientExecutor.createNetwork(network.getId(), dockerNetwork); dockerNetwork.addMetadata(IsNetworkContainerObject.class, new IsNetworkContainerObject()); base.evaluate(); } catch (Throwable t) { errors.add(t); } finally { if (networkId != null) { dockerClientExecutor.removeNetwork(networkId); } } MultipleFailureException.assertEmpty(errors); } }; } }